package com.me.study.javaCore.reflection;

import com.me.common.pojo.Point;

import java.lang.reflect.Array;

/**
 * Reflection：通过反射操作数组
 * 作者     JSD1402班
 * 时间     下午2:04:09
 */
public class ArrayReflect {

    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50, 60};
        Point[] points = {new Point(10, 10), new Point(20, 20),
                new Point(30, 30), new Point(40, 40)};
        System.out.println("扩容前:");
        printArray(numbers);
        System.out.println("----------------");
        printArray(points);
        System.out.println("---------------------------");
        System.out.println("扩容后:");
        numbers = (int[]) extend(numbers);
        points = (Point[]) extend(points);
        printArray(numbers);
        System.out.println("----------------");
        printArray(points);

        // 创建多维数组的方式
        // 创建二维数组并且遍历
        int[][] arr1 = (int[][]) Array.newInstance(int.class, 3, 3);
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                System.out.print(arr1[i][j] + " ");
            }
            System.out.println();
        }

        // 创建三维数组
        String[][][] arr2 = (String[][][]) Array.newInstance(String.class, 3, 4, 5);
    }

    /**
     * 反射遍历数组
     */
    public static void printArray(Object obj) {
        // 获取数组长度
        for (int i = 0; i < Array.getLength(obj); i++) {
            // 通过下标获取数组元素
            System.out.println(Array.get(obj, i));
        }
    }

    /**
     * 反射扩容50%原数组
     */
    public static Object extend(Object obj) {
        // 定义新数组的长度
        int len = (int) (Array.getLength(obj) * 1.5);
        // 定义新数组的元素类型
        Class<?> c = obj.getClass().getComponentType();
        // 反射创建新数组
        Object temp = Array.newInstance(c, len);
        // 把原数组的内容拷贝到新数组中
        for (int i = 0; i < Array.getLength(obj); i++) {
            Array.set(temp, i, Array.get(obj, i));
        }
        return temp;
    }
}
